#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/cpu.h>
#include <linux/sched.h>
#include <linux/sched/task.h>
#include <linux/sched/init.h>
#include <linux/smp.h>
#include <linux/irqflags.h>

#include <linux/delay.h>

__weak void run_user(void)
{
}

__init static void do_initcalls(void)
{
    call_normal_init();
}

__init static void kernel_init_freeable(void)
{
    smp_prepare_cpus(setup_max_cpus);

    smp_init();
    sched_init_smp();

    do_initcalls();
}

static int kernel_init(void *unused)
{
    kernel_init_freeable();

    call_late_init();
    run_user();

    while (1)
    {
        __set_current_state(TASK_PARKED);
        schedule();
    }

    return 0;
}

void kernel_init_startup(void)
{
    user_mode_thread(kernel_init, NULL, CLONE_FS);
}
